package com.xjh.bo;

import com.xjh.bo.validgroup.Save;
import com.xjh.bo.validgroup.Update;
import com.xjh.utils.annotation.Check;
import com.xjh.utils.annotation.CheckType;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;

/**
 * @author XuJianHua
 * @version 1.0
 * @company 湖南安第斯信息科技有限公司, 版权所有
 * @date 2022/7/22 9:21
 */
@Data
@NoArgsConstructor
/**
 *SpringBoot版本2.3.4.RELEASE以后发现没有javax.validation包
 *需要手动引入spring-boot-starter-validation包
 * 参数校验只对Post请求中加@valid 和 @RequestBody的前端传来的实体对象有效
 * */
public class TestValidBO {

    @NotNull(message = "不能为空,其他类型对象或者实体用NotNull")
    private Integer testNotNull;

    @NotBlank(message = "不能为空,校验字符串用NotBlack")
    private String testNotBlack;

    @Null(message = "该字段必须为空")
    private Integer testNull;

    @Valid
    @NotNull(message = "对象不能为空，必须再加一个Valid注解，否则如果嵌套对象中的参数校验不生效")
    private AclUserBO aclUserBO;

    @NotEmpty(message = "集合不能为null且长度不能为0,用NotEmpty")
    private List<AclUserBO> userList;

    @Max(value = 18,message =("最大值<=18"))
    @NotBlank
    private String testMax;

    // 注意 testRange为null时也可通过校验
    @Range(min = 1,max = 10,message = ("值的范围在1到10"))
    private Integer testRange;

    @Length(max = 100, message = "字符串长度不能大于100")
    private String testLength;

    @NotBlank(message = "门店联系人电话不能为空！")
    @Pattern(regexp ="^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(16[5,6])|(17[0-8])|(18[0-9])|(19[1、5、8、9]))\\d{8}$",message = "请输入正确格式手机号")
    private String clientContactPhone;
    // 签名的^$|是额外添加的意思是为空字符串时不校验
    @Pattern(regexp = "^$|^([1-9]\\d{3}-)(([0]{0,1}[1-9]-)|([1][0-2]-))(([0-3]{0,1}[0-9]))$",message = "请输入yyyy-MM-dd格式时间")
    private String arrivalTime;

    // 分组校验，只在更新的时候要求必须传该参数， 请求的controller方法加上： @Validated(TestValidBO.Save.class)，此时没加分组的条件，就是任何情况下都生效
    @Min(value = 10000000000000000L, groups = Update.class)
    private String group;

    @Min(value = 10000000000000000L, groups = {Update.class, Save.class})
    private String group1;



    // 使用自定义注解进行校验
    @Check(type= CheckType.REQUEST_NO,message="请求流水号格式错误")
    private String requestNo;
}



/**
 * 自定义注解实现参数校验步骤：
 *
 *
 *
 * java中可不可以在参数实体中使用注解实现：例如sex字段为女，对age字段增加一个范围校验，如果为男则不校验？
 *
 * */